package com.zjl.学习.第06章_块步骤_读操作写.A_ItemReader块读;

import com.zjl.学习.第06章_块步骤_读操作写.User;
import org.springframework.batch.item.database.builder.JdbcCursorItemReaderBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.ArgumentPreparedStatementSetter;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Component;

import javax.sql.DataSource;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * Spring Batch 提供2种从数据库中读取数据的方式：
 * 居于游标方式
 *          游标遍历时，获取数据表中某一条数据，如果使用JDBC操作，游标指向的那条数据会被封装到ResultSet中，
 *          如果想将数据从ResultSet读取出来，需要借助Spring Batch 提供RowMapper 实现表数据与实体对象的映射
 *
 * 居于分页方式
 * 游标的方式是查询出所有满足条件的数据，然后一条一条读取，而分页是按照指定设置的pageSize数，一次性读取pageSize条。
 * 分页查询方式需要几个要素
 *      1>实体对象，跟游标方式一样
 *      2>RowMapper映射对象，跟游标方式一样
 *      3>数据源，跟游标方式一样
 *      4>PagingQueryProvider 分页逻辑提供者
 *
 */
public class A4_读数据库 {
    @Autowired
    private static DataSource dataSource;

    public static void main(String[] args) {
        new JdbcCursorItemReaderBuilder<User>()
                .name("userCursorItemReader")
                .dataSource(dataSource)
                .sql("select * from user where id < ?")
                .preparedStatementSetter(new ArgumentPreparedStatementSetter(new Object[]{16}))//添加变量
                .rowMapper(new MyUserRowMapper())
                .build();
    }
}
@Component
class MyUserRowMapper implements RowMapper<User> {
    @Override
    public User mapRow(ResultSet rs, int rowNum) throws SQLException {
        User user = new User();
        user.setId(rs.getLong("id"));
        user.setName(rs.getString("name"));
        user.setAge(rs.getInt("age"));
        return user;
    }
}
